sources <- c("ESPN", "FantasyData", "FantasyPros", "FantasySharks", 
             "FantasyFootballNerd", "NumberFire", "Yahoo",
             "RTSports", "Walterfootball")

scrape <- scrape_data(src = sources,
                      pos = c('QB', 'RB', 'WR', 'TE', 'DST'),
                      season = 2020, 
                      week = week)

Simulation Time!

n_sims <- 10000

tic()
sim_lu <- map_df(1:n_sims, generate_lineup) %>%
  rename(pts_base = points) %>%  
  mutate(position = factor(position, 
                           levels = c("QB", "RB", "WR", "TE", "DST"))) %>% 
  select(lineup, Name, team, position, pts_base, pts_pred, sd_pts, Salary)
toc()
## 272.346 sec elapsed

Results

ggplotly(sim_lu %>% 
           group_by(Name, position, Salary) %>% 
           dplyr::summarize(lu = n_distinct(lineup)) %>% 
           ungroup() %>% 
           group_by(position) %>% 
           top_n(10, lu) %>% 
           ungroup() %>% 
           arrange(position, desc(lu)) %>% 
           mutate(Name = factor(Name),
                  Name = fct_reorder(Name, lu),
                  pct = round(lu / n_sims, 3) * 100) %>% 
           ggplot(aes(x = Name, y = pct, fill = Salary,
                      text = paste(Name, "in", lu, "lineups with", Salary, "salary"))) +
           geom_bar(stat = "identity") +
           facet_wrap(~position, ncol = 2, scales = "free_y") +
           coord_flip() +
           scale_fill_viridis_c() +
           xlab("") +
           ylab("Lineups (thousands)") +
           ggtitle("Top 10 Players By Position")) %>% 
  ggplotly(tooltip = "text")
plyr_lu <- sim_lu %>%
  group_by(Name, position) %>%
  dplyr::summarize(lu=n_distinct(lineup)) %>%
  ungroup() 

ggplotly(projections %>% 
  filter(avg_type=='weighted') %>%
  mutate(Name = ifelse(pos=="DST", last_name, paste(first_name, last_name))) %>%
  inner_join(fan_duel, by = c("Name", "position")) %>%
  select(Name, team, position, points, Salary, sd_pts) %>%
  left_join(plyr_lu, by='Name') %>%
  replace_na(list(lu=0)) %>%
  mutate(lu_bin=ifelse(lu==0, '0 Lineups', '>=1 Lineups'),
         lu_5=cut(lu,5, labels = FALSE)) %>%
  ggplot(aes(x=Salary, y=points, color=lu_bin, size=sd_pts, text=Name)) +
  geom_point() +
  theme_minimal() +
  scale_color_manual(values = c('red', 'blue'), name="") +
  geom_smooth(inherit.aes = FALSE, aes(x=Salary, y=points), method = 'lm') +
  ylab('Projected Points') +
  xlab('Salary') +
  ggtitle('Who makes it into Optimized Lineups?') +
  scale_x_continuous(labels=scales::dollar))
lu_df <- sim_lu %>%
  group_by(lineup) %>%
  dplyr::summarize(lineup_pts=sum(pts_pred),
                   lineup_sd=sum(sd_pts)) %>%
  ungroup()

pto <- psel(lu_df, low(lineup_sd) * high(lineup_pts))


ggplotly(ggplot(lu_df, aes(y=lineup_pts, x=lineup_sd, text = paste0("Lineup: ", lineup))) +
  geom_point() +
  geom_point(data=pto, size=5) +
  ylab('Lineup Points') +
  xlab('Lineup Points St Dev') +
  ggtitle('Lineup Points vs. Uncertainty',
          subtitle = 'Pareto Lineups Bolded'))
psel(lu_df, low(lineup_sd) * high(lineup_pts)) %>%
  left_join(sim_lu, by='lineup') %>%
  group_by(lineup) %>%
  arrange(lineup_pts, position, desc(Salary)) %>%
  select(lineup, lineup_pts, lineup_sd, Name, team, position, pts_pred, sd_pts, Salary) %>%
  mutate_at(vars(lineup_pts, lineup_sd, pts_pred, sd_pts), function(x) round(x, 2)) %>%
  knitr::kable() %>%
  kable_styling(fixed_thead = T) %>%
  column_spec(1:3, bold=TRUE) %>%
  collapse_rows(columns = 1:3, valign = 'top') %>%
  scroll_box(height = '700px', width = '100%')
lineup lineup_pts lineup_sd Name team position pts_pred sd_pts Salary
9463 120.73 3.76 Deshaun Watson HOU QB 21.67 0.34 7700
Dalvin Cook MIN RB 22.21 0.54 10500
Aaron Jones GBP RB 16.00 0.31 8200
James Conner PIT RB 14.24 0.31 7000
Keenan Allen LAC WR 16.25 0.50 8000
Jerry Jeudy DEN WR 11.11 0.41 5700
Jakeem Grant MIA WR 8.79 0.45 4600
Ryan Griffin NYJ TE 2.61 0.08 4100
Cincinnati Bengals CIN DST 7.86 0.82 3700
6038 121.61 3.80 Deshaun Watson HOU QB 21.87 0.34 7700
Dalvin Cook MIN RB 21.26 0.54 10500
Kalen Ballage LAC RB 12.63 0.62 5800
Adrian Peterson DET RB 9.35 0.08 5100
Julio Jones ATL WR 15.68 0.69 8100
Keenan Allen LAC WR 16.11 0.50 8000
Jerry Jeudy DEN WR 11.11 0.41 5700
Hunter Henry LAC TE 8.94 0.44 5500
Dallas Cowboys DAL DST 4.66 0.18 3000
1090 123.06 4.14 Deshaun Watson HOU QB 21.16 0.34 7700
Dalvin Cook MIN RB 20.43 0.54 10500
James Conner PIT RB 14.37 0.31 7000
Kalen Ballage LAC RB 12.25 0.62 5800
Keenan Allen LAC WR 15.24 0.50 8000
JuJu Smith-Schuster PIT WR 13.71 0.97 6500
Jakobi Meyers NEP WR 11.65 0.22 6000
Hunter Henry LAC TE 9.42 0.44 5500
Dallas Cowboys DAL DST 4.82 0.18 3000
9457 124.30 4.30 Deshaun Watson HOU QB 21.24 0.34 7700
Aaron Jones GBP RB 16.94 0.31 8200
Antonio Gibson WAS RB 14.82 0.44 6500
Kalen Ballage LAC RB 12.60 0.62 5800
Julio Jones ATL WR 15.99 0.69 8100
Keenan Allen LAC WR 15.22 0.50 8000
Terry McLaurin WAS WR 14.01 0.59 7300
Eric Ebron PIT TE 8.83 0.64 5400
Dallas Cowboys DAL DST 4.64 0.18 3000
3214 124.52 4.44 Deshaun Watson HOU QB 21.24 0.34 7700
Dalvin Cook MIN RB 20.43 0.54 10500
Antonio Gibson WAS RB 13.44 0.44 6500
Kalen Ballage LAC RB 12.38 0.62 5800
Julio Jones ATL WR 16.68 0.69 8100
Terry McLaurin WAS WR 14.57 0.59 7300
Jerry Jeudy DEN WR 11.32 0.41 5700
Eric Ebron PIT TE 9.69 0.64 5400
Dallas Cowboys DAL DST 4.78 0.18 3000
5682 125.41 4.52 Deshaun Watson HOU QB 21.25 0.34 7700
Dalvin Cook MIN RB 21.15 0.54 10500
Antonio Gibson WAS RB 13.41 0.44 6500
Salvon Ahmed MIA RB 13.26 1.24 5600
Keenan Allen LAC WR 15.92 0.50 8000
Jakobi Meyers NEP WR 11.58 0.22 6000
Jerry Jeudy DEN WR 10.89 0.41 5700
Mark Andrews BAL TE 11.73 0.54 6500
Detroit Lions DET DST 6.23 0.28 3500
3640 126.70 4.64 Deshaun Watson HOU QB 22.13 0.34 7700
Dalvin Cook MIN RB 21.72 0.54 10500
Antonio Gibson WAS RB 14.27 0.44 6500
Kalen Ballage LAC RB 12.67 0.62 5800
Keenan Allen LAC WR 15.46 0.50 8000
Jakobi Meyers NEP WR 11.54 0.22 6000
Marquise Brown BAL WR 12.92 1.25 5900
Mark Andrews BAL TE 11.36 0.54 6500
Dallas Cowboys DAL DST 4.64 0.18 3000
2954 126.82 5.27 Deshaun Watson HOU QB 21.71 0.34 7700
Dalvin Cook MIN RB 21.71 0.54 10500
James Robinson JAC RB 16.24 0.96 7200
Salvon Ahmed MIA RB 12.34 1.24 5600
Terry McLaurin WAS WR 14.12 0.59 7300
Jakobi Meyers NEP WR 11.81 0.22 6000
Jerry Jeudy DEN WR 11.08 0.41 5700
Hunter Henry LAC TE 9.63 0.44 5500
Los Angeles Chargers LAC DST 8.17 0.53 4500
2679 127.49 5.29 Justin Herbert LAC QB 22.80 0.46 8500
Dalvin Cook MIN RB 21.85 0.54 10500
Kareem Hunt CLE RB 14.70 1.15 6700
Kalen Ballage LAC RB 13.82 0.62 5800
Keenan Allen LAC WR 15.67 0.50 8000
Jakobi Meyers NEP WR 11.40 0.22 6000
Jerry Jeudy DEN WR 10.80 0.41 5700
Austin Hooper CLE TE 8.64 0.56 5100
Cincinnati Bengals CIN DST 7.81 0.82 3700
5211 128.34 5.55 Deshaun Watson HOU QB 21.96 0.34 7700
Dalvin Cook MIN RB 20.77 0.54 10500
Derrick Henry TEN RB 17.49 1.04 8200
Kalen Ballage LAC RB 13.03 0.62 5800
Terry McLaurin WAS WR 15.85 0.59 7300
JuJu Smith-Schuster PIT WR 14.26 0.97 6500
Curtis Samuel CAR WR 11.87 0.63 5600
Eric Ebron PIT TE 8.41 0.64 5400
Dallas Cowboys DAL DST 4.70 0.18 3000
1467 128.38 5.82 Deshaun Watson HOU QB 21.74 0.34 7700
Dalvin Cook MIN RB 21.43 0.54 10500
James Robinson JAC RB 16.48 0.96 7200
Giovani Bernard CIN RB 15.40 1.63 6300
Keenan Allen LAC WR 16.53 0.50 8000
Terry McLaurin WAS WR 14.59 0.59 7300
Jakeem Grant MIA WR 7.47 0.45 4600
Eric Ebron PIT TE 9.68 0.64 5400
Dallas Cowboys DAL DST 5.06 0.18 3000
3554 129.74 5.91 Deshaun Watson HOU QB 21.78 0.34 7700
Dalvin Cook MIN RB 21.46 0.54 10500
Giovani Bernard CIN RB 17.90 1.63 6300
Kalen Ballage LAC RB 12.37 0.62 5800
Julio Jones ATL WR 16.00 0.69 8100
JuJu Smith-Schuster PIT WR 13.96 0.97 6500
Jakobi Meyers NEP WR 11.55 0.22 6000
Hunter Henry LAC TE 9.68 0.44 5500
New York Jets NYJ DST 5.05 0.44 3100
5575 130.75 6.02 Deshaun Watson HOU QB 21.96 0.34 7700
James Robinson JAC RB 16.55 0.96 7200
Antonio Gibson WAS RB 13.72 0.44 6500
Giovani Bernard CIN RB 16.15 1.63 6300
Julio Jones ATL WR 16.25 0.69 8100
Keenan Allen LAC WR 15.88 0.50 8000
Jerry Jeudy DEN WR 11.75 0.41 5700
Hunter Henry LAC TE 8.93 0.44 5500
Pittsburgh Steelers PIT DST 9.56 0.61 5000
7493 131.38 6.15 Deshaun Watson HOU QB 21.68 0.34 7700
James Robinson JAC RB 15.78 0.96 7200
Antonio Gibson WAS RB 14.12 0.44 6500
Giovani Bernard CIN RB 17.19 1.63 6300
Julio Jones ATL WR 15.95 0.69 8100
Keenan Allen LAC WR 16.30 0.50 8000
Jakobi Meyers NEP WR 11.93 0.22 6000
Mark Andrews BAL TE 11.68 0.54 6500
Cincinnati Bengals CIN DST 6.76 0.82 3700
2200 131.82 7.06 Deshaun Watson HOU QB 21.52 0.34 7700
Dalvin Cook MIN RB 21.66 0.54 10500
Derrick Henry TEN RB 17.05 1.04 8200
Kalen Ballage LAC RB 11.81 0.62 5800
Justin Jefferson MIN WR 18.76 1.59 6700
Jakobi Meyers NEP WR 11.62 0.22 6000
Marquise Brown BAL WR 12.86 1.25 5900
Eric Ebron PIT TE 8.77 0.64 5400
Cincinnati Bengals CIN DST 7.78 0.82 3700
1093 131.99 Deshaun Watson HOU QB 21.24 0.34 7700
Dalvin Cook MIN RB 21.61 0.54 10500
Giovani Bernard CIN RB 16.84 1.63 6300
Kalen Ballage LAC RB 12.49 0.62 5800
Adam Thielen MIN WR 19.41 1.73 7900
Mike Williams LAC WR 11.45 0.43 5900
Jerry Jeudy DEN WR 11.01 0.41 5700
Mark Andrews BAL TE 11.03 0.54 6500
Cincinnati Bengals CIN DST 6.91 0.82 3700
8227 132.56 7.57 Lamar Jackson BAL QB 25.43 0.83 8400
Derrick Henry TEN RB 18.61 1.04 8200
Giovani Bernard CIN RB 17.58 1.63 6300
Salvon Ahmed MIA RB 12.80 1.24 5600
Keenan Allen LAC WR 15.31 0.50 8000
Terry McLaurin WAS WR 14.45 0.59 7300
Jakobi Meyers NEP WR 11.69 0.22 6000
Eric Ebron PIT TE 8.20 0.64 5400
Miami Dolphins MIA DST 8.49 0.89 4800
9032 133.36 7.74 Deshaun Watson HOU QB 21.96 0.34 7700
Dalvin Cook MIN RB 22.14 0.54 10500
Giovani Bernard CIN RB 14.79 1.63 6300
Kalen Ballage LAC RB 13.24 0.62 5800
Terry McLaurin WAS WR 16.24 0.59 7300
JuJu Smith-Schuster PIT WR 14.05 0.97 6500
Chase Claypool PIT WR 14.36 1.61 6400
Eric Ebron PIT TE 9.23 0.64 5400
New Orleans Saints NOS DST 7.35 0.80 4100
1265 134.24 8.72 Deshaun Watson HOU QB 22.22 0.34 7700
James Robinson JAC RB 16.65 0.96 7200
Kalen Ballage LAC RB 12.74 0.62 5800
Jamaal Williams GBP RB 14.80 2.05 5300
Davante Adams GBP WR 19.53 1.12 9500
Keenan Allen LAC WR 15.88 0.50 8000
Adam Thielen MIN WR 17.76 1.73 7900
Eric Ebron PIT TE 9.03 0.64 5400
Atlanta Falcons ATL DST 5.63 0.77 3200
3517 134.40 9.53 Deshaun Watson HOU QB 21.25 0.34 7700
Dalvin Cook MIN RB 20.58 0.54 10500
Giovani Bernard CIN RB 17.41 1.63 6300
Salvon Ahmed MIA RB 13.50 1.24 5600
Keenan Allen LAC WR 15.67 0.50 8000
Adam Thielen MIN WR 17.64 1.73 7900
Justin Jefferson MIN WR 15.81 1.59 6700
Adam Shaheen MIA TE 7.65 1.79 4300
Dallas Cowboys DAL DST 4.87 0.18 3000
7234 137.54 10.05 Deshaun Watson HOU QB 21.62 0.34 7700
Dalvin Cook MIN RB 20.93 0.54 10500
James Robinson JAC RB 16.20 0.96 7200
Giovani Bernard CIN RB 15.20 1.63 6300
Adam Thielen MIN WR 17.53 1.73 7900
Terry McLaurin WAS WR 14.70 0.59 7300
Alshon Jeffery PHI WR 16.87 3.45 4700
Eric Ebron PIT TE 9.65 0.64 5400
Dallas Cowboys DAL DST 4.84 0.18 3000
2387 139.46 11.86 Teddy Bridgewater CAR QB 29.22 4.50 7200
Dalvin Cook MIN RB 21.85 0.54 10500
Kalen Ballage LAC RB 13.19 0.62 5800
Kerryon Johnson DET RB 13.52 2.68 4800
Keenan Allen LAC WR 15.77 0.50 8000
Terry McLaurin WAS WR 15.13 0.59 7300
JuJu Smith-Schuster PIT WR 13.62 0.97 6500
Austin Hooper CLE TE 8.32 0.56 5100
Miami Dolphins MIA DST 8.84 0.89 4800
8483 142.30 14.18 Jake Luton JAC QB 35.32 9.00 6500
Dalvin Cook MIN RB 21.48 0.54 10500
James Robinson JAC RB 16.31 0.96 7200
Kalen Ballage LAC RB 12.34 0.62 5800
Keenan Allen LAC WR 15.46 0.50 8000
Terry McLaurin WAS WR 14.21 0.59 7300
JuJu Smith-Schuster PIT WR 13.10 0.97 6500
Austin Hooper CLE TE 8.73 0.56 5100
New York Jets NYJ DST 5.34 0.44 3100
2654 154.74 15.06 P.J. Walker CAR QB 46.88 9.17 6500
Dalvin Cook MIN RB 20.88 0.54 10500
Derrick Henry TEN RB 16.50 1.04 8200
Giovani Bernard CIN RB 16.23 1.63 6300
Julio Jones ATL WR 16.48 0.69 8100
Mike Williams LAC WR 11.24 0.43 5900
Jerry Jeudy DEN WR 11.45 0.41 5700
Austin Hooper CLE TE 9.10 0.56 5100
Houston Texans HOU DST 5.97 0.59 3600